/**
 *  watch 的基本数据格式
 *
 *  {
 *      listen:[]   //  置顶感兴趣的事件  可以使用null或者里面有* 捕捉所有的事件
 *      callback(event){
 *          //  如果事件在listen中声明过 那么回调过来
 *      }
 *  }
 *
 *  event
 *  {
 *      type:""     //  事件的类型
 *      code:0      //  和服务端的返回码是类似的
 *      msg:""      //  一个提示
 *      data:{}     //  如果有数据体的话
 *  }
 *
 */
class EventLoop{
    constructor(){
        this.watcherMap = new Map();
    }

    register(name,watch){
        if(watch.listen == null){
            watch.listen = ['*'];
        }
        if(watch.callback == null){
            watch.callback = function (event) {
                //  todo
            }
        }
        if(this.watcherMap.delete(name)){
            console.log("name = "+name+" 已经注册");
        }
        this.watcherMap.set(name,watch);
        return this;
    }

    unregister(name){
        this.watcherMap.delete(name)
        return this;
    }

    //  发布一个事件 需要通知给具体的观察者
    publishEvent(event){
        if(event.type == null){
            return ;
        }
        this.watcherMap.forEach((x,k) => {
            //  如果匹配到了状态 则回调
            if(x.listen.indexOf('*') != -1 || x.listen.indexOf(event.type) != -1){
                try{
                    x.callback(event);
                }catch (e) {
                    //  这里直接上传日志
                    console.log(e);
                }
            }
        })
    }
}

let event = new EventLoop();
export default event;